package com.aspire.aimini.model;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 统一返回结果类
 *
 * @author wangguiyou
 * @date 2024-12-19
 * @description 统一API响应格式，包含状态码、消息和数据
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "统一返回结果")
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    @Schema(description = "状态码", example = "200")
    private Integer code;

    @Schema(description = "返回消息", example = "操作成功")
    private String msg;

    @Schema(description = "返回数据")
    private T data;

    /**
     * 成功返回（无数据）
     *
     * @return Result<Void>
     */
    public static <T> Result<T> success() {
        return new Result<>(200, "操作成功", null);
    }

    /**
     * 成功返回（带数据）
     *
     * @param data 返回数据
     * @return Result<T>
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(200, "操作成功", data);
    }

    /**
     * 成功返回（自定义消息）
     *
     * @param msg  返回消息
     * @param data 返回数据
     * @return Result<T>
     */
    public static <T> Result<T> success(String msg, T data) {
        return new Result<>(200, msg, data);
    }

    /**
     * 失败返回
     *
     * @param msg 错误消息
     * @return Result<T>
     */
    public static <T> Result<T> error(String msg) {
        return new Result<>(500, msg, null);
    }

    /**
     * 失败返回（自定义状态码）
     *
     * @param code 状态码
     * @param msg  错误消息
     * @return Result<T>
     */
    public static <T> Result<T> error(Integer code, String msg) {
        return new Result<>(code, msg, null);
    }

    /**
     * 判断是否成功
     *
     * @return boolean
     */
    public boolean isSuccess() {
        return this.code != null && this.code == 200;
    }
}